package api

import (
	"gomain/app/model"
	"gomain/app/service"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

type MenuApi struct{}

// 获取菜单列表
func (a *MenuApi) List(r *ghttp.Request) {
	// 获取查询参数
	title := r.Get("title").String()

	// 构建查询条件
	m := g.DB().Model("menus")
	if title != "" {
		m = m.Where("title like ?", "%"+title+"%")
	}

	// 获取数据
	var menus []model.Menu
	err := m.Order("sort asc, id asc").Scan(&menus)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 如果没有数据，返回空数组而不是null
	if len(menus) == 0 {
		r.Response.WriteJson(g.Map{
			"code":  0,
			"msg":   "success",
			"count": 0,
			"data":  []model.Menu{},
		})
		return
	}

	// 构建树形结构
	tree := buildTree(menus, 0)

	r.Response.WriteJson(g.Map{
		"code":  0,
		"msg":   "success",
		"count": len(menus),
		"data":  tree,
	})
}

// 获取菜单列表2
func (a *MenuApi) List2(r *ghttp.Request) {
	// 获取查询参数
	title := r.Get("title").String()

	// 构建查询条件
	m := g.DB().Model("menus")
	if title != "" {
		m = m.Where("title like ?", "%"+title+"%")
	}

	// 获取数据
	var menus []model.Menu
	err := m.Order("sort asc, id asc").Scan(&menus)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 如果没有数据，返回空数组而不是null
	if len(menus) == 0 {
		r.Response.WriteJson(g.Map{
			"code":  0,
			"msg":   "success",
			"count": 0,
			"data":  []model.Menu{},
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code":  0,
		"msg":   "success",
		"count": len(menus),
		"data":  menus,
	})
}

// 添加菜单
func (a *MenuApi) Add(r *ghttp.Request) {
	var menu model.Menu
	if err := r.Parse(&menu); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 确保 ParentId 不为空
	if menu.ParentId < 0 {
		menu.ParentId = 0
	}

	// 插入数据
	_, err := g.DB().Model("menus").Data(g.Map{
		"parent_id":  menu.ParentId,
		"title":      menu.Title,
		"icon":       menu.Icon,
		"type":       menu.Type,
		"name":       menu.Name,
		"path":       menu.Path,
		"component":  menu.Component,
		"permission": menu.Permission,
		"sort":       menu.Sort,
		"visible":    menu.Visible,
		"status":     menu.Status,
	}).Insert()

	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "添加成功",
	})
}

// 更新菜单
func (a *MenuApi) Update(r *ghttp.Request) {
	var menu model.Menu
	if err := r.Parse(&menu); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	if err := service.Menu.Update(&menu); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "success",
	})
}

// 删除菜单
func (a *MenuApi) Delete(r *ghttp.Request) {
	id := r.Get("id").Int()
	if id == 0 {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  "ID不能为空",
		})
		return
	}

	if err := service.Menu.Delete(id); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "success",
	})
}

// 获取菜单数据
func (a *MenuApi) GetMenuData(r *ghttp.Request) {
	menus, err := service.Menu.GetMenuTree()
	if err != nil {
		r.Response.WriteJson([]g.Map{}) // 出错时返回空数组
		return
	}

	// 直接返回菜单数据数组
	r.Response.WriteJson(menus)
}

// GetTree 获取菜单树
func (a *MenuApi) GetTree(r *ghttp.Request) {
	// 获取所有菜单
	var menus []model.Menu
	err := g.DB().Model("menus").Order("sort asc").Scan(&menus)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 构建树形结构
	tree := buildTree(menus, 0)

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "success",
		"data": tree,
	})
}

// buildTree 构建树形结构
func buildTree(menus []model.Menu, parentId int) []model.Menu {
	var tree []model.Menu
	for _, menu := range menus {
		if menu.ParentId == parentId {
			// 创建新的菜单对象，避免修改原始数据
			newMenu := menu
			// 递归构建子节点前先初始化 Children 为空数组
			newMenu.Children = buildTree(menus, menu.Id)
			// 只有当有子节点时才添加Children
			if len(newMenu.Children) == 0 {
				newMenu.Children = nil
			}
			tree = append(tree, newMenu)
		}
	}
	return tree
}

// Get 获取菜单信息
func (a *MenuApi) Get(r *ghttp.Request) {
	id := r.Get("id").Int()
	var menu *model.Menu
	err := g.DB().Model("menus").Where("id", id).Scan(&menu)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "success",
		"data": menu,
	})
}
